package com.wms.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wms.common.QueryPageParam;
import com.wms.common.Result;
import com.wms.entity.Goods;
import com.wms.entity.Record;
import com.wms.service.GoodsService;
import com.wms.service.RecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author wms
 * @since 2024-08-08
 */
@RestController//控制器
@CrossOrigin//跨域
@RequestMapping("/record")
public class RecordController {

    //记录服务
    private final RecordService recordService;

    //商品服务
    private final GoodsService goodsService;

    /*
     * 构造方法注入记录服务和商品服务
     * @param recordService 记录服务
     * @param goodsService 商品服务
     */
    @Autowired
    public RecordController(RecordService recordService, GoodsService goodsService) {
        this.recordService = recordService;
        this.goodsService = goodsService;
    }

    /**
     * 分页查询记录
     * 
     * @param query 查询参数
     * @return 分页查询结果
     */
    @PostMapping("/listPage")
    public Result listPage(@RequestBody QueryPageParam query) {
        HashMap<String, Object> param = query.getParam();
        String name = (String) param.get("name");
        String goodstype = (String) param.get("goodstype");
        String storage = (String) param.get("storage");
        String roleId = (String) param.get("roleId");
        String userId = (String) param.get("userId");

        /* // 分页查询
        Page<Record> page = new Page<Record>();//分页对象
        page.setCurrent(query.getPageNum());//当前页数
        page.setSize(query.getPageSize());//每页多少条数据 */

        // 创建分页对象
        Page<Record> page = new Page<>(query.getPageNum(), query.getPageSize());

        // 构建查询条件
        QueryWrapper<Record> queryWrapper = new QueryWrapper<>();
        // 多表关联：record(a) -> goods(b) -> storage(c), goods(b) -> goodstype(d)
        /**
        record (a)
        │
        ├─ goods (b) ──┬─ storage (c)  [仓库]
        │              │
        │              └─ goodstype (d) [商品类型]
        │
        └─ userId [用户]
        
            a = record（出入库记录表）
            b = goods（商品表）
            c = storage（仓库表）
            d = goodstype（商品类型表）
         */
        queryWrapper.apply("a.goods = b.id AND b.storage = c.id AND b.goodsType = d.id");

        // 权限控制：普通用户只能查看自己的记录
        if ("2".equals(roleId) && StringUtils.isNotBlank(userId)) {
            queryWrapper.apply("a.userId = {0}", userId);
        }

        // 动态查询条件
        if (isValidParam(name)) {
            queryWrapper.like("b.name", name);
        }
        if (isValidParam(goodstype)) {
            queryWrapper.eq("d.id", goodstype);
        }
        if (isValidParam(storage)) {
            queryWrapper.eq("c.id", storage);
        }

        IPage<Record> result = recordService.pageCC(page, queryWrapper);
        return Result.suc(result.getRecords(), result.getTotal());
    }

    /**
     * 判断参数是否有效（不为空且不是"null"字符串）
     * 
     * @param param 待校验的参数
     * @return 是否有效
     */
    private boolean isValidParam(String param) {
        return StringUtils.isNotBlank(param) && !"null".equals(param);
    }

    /*
     * 新增
     * @param record 记录对象
     * @return 新增结果
     */
    @PostMapping("/save")
    public Result save(@RequestBody Record record){
        Goods goods= goodsService.getById(record.getGoods());
        int n = record.getCount(); //入库或出库物品的数量
        if ("2".equals(record.getAction())){ //出库
            n = -n;
            record.setCount(n);
        }
        int num = goods.getCount() + n;  //原本的数量加上入库的数量,出库则为-n
        goods.setCount(num); //更新物品的count属性
        goodsService.updateById(goods);

        return recordService.save(record)?Result.suc():Result.fail();
    }

}
